package com.luxsoft.sw3.cfdi;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import mx.gob.sat.cfd.x3.ComprobanteDocument;
import mx.gob.sat.cfd.x3.ComprobanteDocument.Comprobante;
import mx.gob.sat.cfd.x3.ComprobanteDocument.Comprobante.Receptor;

import org.apache.log4j.Logger;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.XmlValidationError;

import com.luxsoft.siipap.model.Direccion;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.sw3.cfd.model.CFDException;
import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;
import com.luxsoft.sw3.cfd.model.Conversiones;
import com.luxsoft.utils.LoggerHelper;

public class CFDIValidaciones {
	
	public static List validarClienteParaCFD(Cliente cliente){
		ComprobanteDocument doc=ComprobanteDocument.Factory.newInstance();
		Comprobante cfd=doc.addNewComprobante();
		Receptor receptor=cfd.addNewReceptor();
		
		receptor.setNombre(cliente.getNombre());
		receptor.setRfc(CFDUtils.limpiarRfc(cliente.getRfc()));
		Direccion direccion=cliente.getDireccionFiscal();
		Conversiones.getTUbicacion(direccion,receptor.addNewDomicilio());
		
		List errores=validar(receptor);
		List<String> res=new ArrayList<String>();
		for(Object o:errores){
			XmlValidationError err=(XmlValidationError)o;
			String pattern="Campo: {0}  Valor: {1}  Desc: {2}";
			res.add(MessageFormat.format(pattern, err.getCursorLocation().getName(),err.getCursorLocation().getTextValue(),err.getMessage()));
			
		}
		return res;
		
	}
	
	public static List validar(final XmlObject node){
		final XmlOptions options=new XmlOptions();
		final List errors=new ArrayList();
		options.setErrorListener(errors);
		node.validate(options);
		for(Object o:errors){
			System.out.println(o.getClass().getName());
		}
		return errors;
		
	}
	
	static Logger logger=LoggerHelper.getLogger();
	
	public static List<XmlValidationError> validarDocumento(ComprobanteFiscal cfdi) {
		cfdi.loadComprobante();
		return validarDocumento(cfdi.getComprobanteDocument());
	}
	
	public static List<XmlValidationError> validarDocumento(ComprobanteDocument document) {
		List<XmlValidationError> errores=CFDIValidaciones.validar(document);
		if(errores.size()>0){
			StringBuffer buff=new StringBuffer();
			for(XmlValidationError e:errores){				
				buff.append(e.getMessage()+"\n");
				logger.info(e.getMessage());
				System.out.println(e.getMessage());
			}
		}
		return errores;
	}

}
